{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "# Finding the minimum of a smooth function\n",
    "\n",
    "\n",
    "Demos various methods to find the minimum of a function.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f02cdd6f190>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def f(x):\n",
    "    return x**2 + 10 * np.sin(x)\n",
    "\n",
    "\n",
    "x = np.arange(-10, 10, 0.1)\n",
    "plt.plot(x, f(x))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now find the minimum with a few methods\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      fun: -7.945823375615215\n",
      " hess_inv: array([[0.08589237]])\n",
      "      jac: array([-1.1920929e-06])\n",
      "  message: 'Optimization terminated successfully.'\n",
      "     nfev: 12\n",
      "      nit: 5\n",
      "     njev: 6\n",
      "   status: 0\n",
      "  success: True\n",
      "        x: array([-1.30644012])\n"
     ]
    }
   ],
   "source": [
    "from scipy import optimize\n",
    "\n",
    "# The default (Nelder Mead)\n",
    "print(optimize.minimize(f, x0=0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      fun: -7.945823375615166\n",
      " hess_inv: <1x1 LbfgsInvHessProduct with dtype=float64>\n",
      "      jac: array([-1.59872117e-06])\n",
      "  message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'\n",
      "     nfev: 12\n",
      "      nit: 5\n",
      "     njev: 6\n",
      "   status: 0\n",
      "  success: True\n",
      "        x: array([-1.30644015])\n"
     ]
    }
   ],
   "source": [
    "print(optimize.minimize(f, x0=0, method=\"L-BFGS-B\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "vscode": {
   "interpreter": {
    "hash": "e82bdbec295f1d416caad911bfe8299822751c36b2e078ad810889afff869327"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
